const fp = require('lodash/fp')
const { Maybe, Container } = require('./support')

// 一 、 将下面异步代码使用 Promise 的方式改进
const promise = new Promise((resolve,reject) => {
    resolve('成功')
});
promise.then(() => {
    var a = 'hello '
    return a
}).then((val) => {
    var b = 'lagou '
    return val + b
}).then((val) => {
    var c = 'I v U'
    console.log(val + c);
})


// 二、基于以下代码完成下面的四个练习
//数据
// horsepower  马力， dollar_value  价格，in—stock  库存
const cars = [
  {
    name: 'Ferrari FF', horsepower: 660,
    dollar_value: 700000, in_stock: true
  },
  {
    name: 'Spyker C12 Zagato',
    horsepower: 650, dollar_value: 648000,
    in_stock: false
  },
  {
    name: 'Jaguar XKR-S', horsepower:
      550, dollar_value: 132000, in_stock:
      false
  },
  {
    name: 'Audi R8', horsepower: 525,
    dollar_value: 114200, in_stock: false
  },
  {
    name: 'Aston Martin One-77 ',
    horsepower: 750, dollar_value: 1850000,
    in_stock: true
  },
  {
    name: 'Pagani Huayra', horsepower:
      700, dollar_value: 1300000, in_stock:
      false
  },
]
// 练习 1: 使用函数组合 fp.flowRight ()重新实现下面这个函数
let isLastlnStock = fp.flowRight(fp.prop('in_stock') ,fp.last);
console.log(isLastlnStock(cars));


// 练习 2 :使用 fp.flowRight() 、 fp.prop() 和 fp.first() 获取第一个 car 的 name
let isFirstCar = fp.flowRight(fp.prop('name') ,fp.first);
console.log(isFirstCar(cars));


// 练习 3: 使用帮助函数 _average 重构averageDollarValue ,使用函数组合的方式实现
let _average = function (xs) {
    return fp.reduce(fp.add, 0, xs) /
      xs.length
  } //  <-无须改动
  let averageDollarValue = fp.flowRight(_average,fp.map((car) => car.dollar_value));
  console.log(averageDollarValue(cars));


// 练习 4 :使用 flowRight  写一个 sanitizeNames ()函数，返回一个下划线连接的小写字符串，
// 把数组中的 name 转换为这种形式：例如：sanitizeNames(["Hello World"]) => ["hello_world"]

let _underscore = fp.replace(/\W+/g, '_')  // < - - 无须改动，并在 sanitizeNames中使用它
const trace = fp.curry((str,v) => {
        console.log(str,v);
        return v
    })
    function getData(car){
        // 把首字母转为小写
        car.name =  fp.replace(/\b\w/g, th => fp.toLower(th),car.name)
        return car
    }
    function getData1(car){
        car.name =  _underscore(car.name)
        return car
    }
    let sanitizeNames = fp.flowRight(fp.map(getData1),fp.map(getData));
    console.log(sanitizeNames(cars));

// 三、基于下面提供的代码，完成后续的四个练习

// 练习 1 : 使 用 fp.add (x, y) 和 fp.map (f, x)创建一个能让 functor 里的值增加的函数ex1

let maybe = Maybe.of([5, 6, 1]);
let exl = (arr) => {
  return fp.map ((val) => fp.add(val,1), arr)
}
console.log(maybe.map(exl));

// 练习 2 : 实现一个函数 ex2 , 能够使用 fp.first 获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = (arr) => {
  return fp.first(arr)
}
console.log(xs.map(ex2));

// 练习 3 : 实现一个函数 ex3 , 使用 safeProp 和 fp.first 找到 user 的名字的首字母
let safeProp = fp.curry(function (x, o) {
  return Maybe.of(o[x])
})
let user = { id: 2, name: 'Albert' }
let ex3 = (val) => {
  return fp.first(val)
}
let aa = safeProp('name',user);
console.log(aa.map(ex3));

// 练习 4 : 使用 Maybe 重写 ex4 , 不要有 if 语句
let ex4 = function (n) {
    return parseInt(n)
}
let maybe4 = Maybe.of(9.6666);
console.log(maybe4.map(ex4));